S3のオブジェクトの最終更新日時は何を元に決定されますか?
困っていること
S3 にオブジェクトをアップロードしました。オブジェクトの最終更新日時を確認したところ、アップロード開始時間が記録されておりました。
アップロード完了時間をメタデータに保持したいのですが、どのようにすればいいでしょうか。
どう解決すればいいの?
S3 のオブジェクトの最終更新日時は 1. オブジェクト作成日(マルチパートアップロードの場合、マルチパートアップロードの開始日) と 2. 最終更新日 のいずれか遅い方です。そのため、オブジェクトをアップロードする際にマルチパートアップロードが発生すると、マルチパートアップロードが開始した時刻となります。
そのため、アップロード完了時刻をオブジェクトのタグに保存する必要があります。
aws s3 cp コマンドを使う場合は、下記のコマンドを実施ください。
$ aws s3 cp <大きいサイズのファイル> s3://<バケット名>/<オブジェクト名> && \ aws s3api put-object-tagging --bucket <バケット名> --key <オブジェクト名> --tagging "TagSet=[{Key=uploaded,Value=`date`}]"
やってみた
EC2 インスタンスを起動し、セッションマネージャーで接続します。EC2 インスタンスには S3 へのアクセス権限を追加します。
まず、1 GiB のダミーデータを作成します。
$ dd if=/dev/zero of=1G.dummy bs=1M count=1000 1000+0 records in 1000+0 records out 1048576000 bytes (1.0 GB) copied, 6.01101 s, 174 MB/s $ ls -l total 1024000 -rw-r--r-- 1 ssm-user ssm-user 1048576000 Jun 12 05:14 1G.dummy
当該のファイルをアップロードします。
$ aws s3 cp 1G.dummy s3://s3-last-modified-test/1G.dummy && \ aws s3api put-object-tagging --bucket s3-last-modified-test --key 1G.dummy --tagging "TagSet=[{Key=uploaded,Value=`date`}]" upload: ./1G.dummy to s3://s3-last-modified-test/1G.dummy
ファイルの最終更新日時と uploaded タグを確認します。
$ aws s3api list-objects-v2 --bucket s3-last-modified-test --prefix 1G.dummy { "Contents": [ { "LastModified": "2024-06-12T05:15:56.000Z", "ETag": "\"80fec5b52db421a0ed6544f01a801b8d-125\"", "StorageClass": "STANDARD", "Key": "1G.dummy", "Size": 1048576000 } ] } $ aws s3api get-object-tagging --bucket s3-last-modified-test --key 1G.dummy { "TagSet": [ { "Value": "Wed Jun 12 05:16:05 UTC 2024", "Key": "uploaded" } ] }
アップロード開始時刻がLast-Modified
、アップロード完了時刻がタグuploaded
として記録されたことが確認できました。
参考資料
システムで定義されたオブジェクトメタデータ - オブジェクトメタデータの使用 - Amazon Simple Storage Service
Last-Modified オブジェクト作成日または最終更新日のいずれか遅い方。マルチパートアップロードの場合、オブジェクトの作成日はマルチパートアップロードの開始日です。